/* 
给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
示例 4:

输入: s = ""
输出: 0
*/
/**
 * @param {string} s
 * @return {number}
 */
// var lengthOfLongestSubstring = function(s) {
//   let index = 0, i = 0, n = s.length, arr = [], maxLen = 0
//   for(; i < n; i++) {
//     if(i !== 0) {
//       index = arr.indexOf(s.charAt(i))
//       if(index !== -1) {
//         // 从数组开头到当前字符串全部截取掉
//         arr.splice(0, index + 1)
//       }
//     }
//     arr.push(s.charAt(i))
//     maxLen = Math.max(maxLen, arr.length)
//   }
//   return maxLen
// };

var lengthOfLongestSubstring = function (s) {
  let left = 0, right = 0, maxLen = 0, resMap = new Map(), strLen = s.length
  for(; right < strLen; right++) {
    // 出现了重复字符, 把左指针移到重复字符下一位, 满足重复字符的索引大于指针
    if(resMap.has(s[right]) && resMap.get(s[right]) >= left) {
      left = resMap.get(s[right]) + 1
    }
    maxLen = Math.max(maxLen, right - left + 1)
    resMap.set(s[right], right)
  }
  return maxLen
}

console.log(lengthOfLongestSubstring('dvdf'))